/*******************************************************************************
 * Copyright (c) 2004, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package com.architexa.org.eclipse.gef.commands;

import java.util.EventObject;

/**
 * Instances of this class are sent whenever stack events occur. The type of event can be
 * determined by calling {@link #getDetail()}, and comparing the return value to constants
 * defined by {@link CommandStack}.
 * <P>Warning: this class is not intended to be subclassed.
 * @since 3.1
 */
public class CommandStackEvent extends EventObject {

private final Command command;
private final int detail;

/**
 * Constructs a new event instance.  The stack specifies the source of the event.  If a
 * command is relevant to the event context, one should be specified.  The detail
 * indicates the type of event occurring.
 * @since 3.1
 * @param stack the command stack
 * @param c a command or <code>null</code>
 * @param detail an integer identifier
 */
public CommandStackEvent(CommandStack stack, Command c, int detail) {
	super(stack);
	this.command = c;
	this.detail = detail; 
}

/**
 * Returns <code>null</code> or a Command if a command is relevant to the current event.
 * @since 3.1
 * @return <code>null</code> or a command
 */
public Command getCommand() {
	return command;
}

/**
 * Returns <code>true</code> if this event is fired prior to the stack changing.
 * @return <code>true</code> if pre-change event
 * @since 3.2
 */
public final boolean isPreChangeEvent() {
	return 0 != (getDetail() & CommandStack.PRE_MASK);
}

/**
 * Returns <code>true</code> if this event is fired after the stack having changed.
 * @return <code>true</code> if post-change event
 * @since 3.2
 */
public final boolean isPostChangeEvent() {
	return 0 != (getDetail() & CommandStack.POST_MASK);
}

/**
 * Returns an integer identifying the type of event which has occurred.
 * @since 3.1
 * @return the detail of the event
 */
public int getDetail() {
	return detail;
}

}
